package com.coder.rental.security;

import jakarta.annotation.Resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;

import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig /*spring boot3 开始 不需要继承spring boot2里面的接口*/{
    @Resource
    private AuthenticationSuccessHandler loginSuccessHandler;

    @Resource
    private LoginFailHandler loginFailHandler;
    @Resource
    private CustomerAccessDeniedHandler customerAccessDeniedHandler;
    @Resource
    private CustomerAnonymousEntryPoint customerAnonymousEntryPoint;
    @Resource
    private UserDetailsService customerUserDetailService;

    @Resource
    private VerifyTokenFilter verifyTokenFilter;

    /**
     * 配置Security过滤链
     * <p>
     * 此方法主要用于配置HTTP安全设置，以保护应用程序的资源。它定义了如何处理登录流程、
     * 会话管理、请求授权、异常处理以及禁用CSRF保护等。
     *
     * @param http 用于配置HTTP安全设置的对象
     * @return 配置好的SecurityFilterChain对象
     * @throws Exception 配置过程中可能抛出的异常
     */
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http)
            throws Exception {
        // 登录前过滤配置
        http.addFilterBefore(verifyTokenFilter, UsernamePasswordAuthenticationFilter.class);
        // http.csrf(AbstractHttpConfigurer::disable);
        http
                .csrf().disable()
                .authorizeHttpRequests()
                .requestMatchers("/rental/user/login", "/error").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()

                .loginProcessingUrl("/rental/user/login")
                // 配置处理登录请求的路径

                //.usernameParameter("username") // 配置用户名字段名
                // .passwordParameter("password") // 配置密码字段名
                .permitAll()
                .successHandler(loginSuccessHandler)   // 设置登录成功处理器
                .failureHandler(loginFailHandler) // 设置登录失败处理器
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS) // 设置会话创建策略为无状态
                .and()
                .cors()
                .and()
                .csrf()
                .disable()
                .userDetailsService(customerUserDetailService);  // 指定自定义的UserDetailsService实现;;

        // 登录过程处理
//        http.formLogin()  // 配置基于表单的登录方式
//                .loginProcessingUrl("rental/user/login")  // 指定登录请求的URL路径
//                .successHandler(loginSuccessHandler)  // 自定义登录成功后的处理逻辑
//                .failureHandler(loginFailHandler)  // 自定义登录失败后的处理逻辑
//                .and()
//
//                // 登录后过滤
//                .sessionManagement()  // 配置会话管理策略
//                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)  // 设置会话创建策略为无状态（不创建会话）
//                .and()
//                .authorizeHttpRequests(request -> request.requestMatchers(new AntPathRequestMatcher("/rental/user/login"))
//                        .anonymous())
//                .authorizeHttpRequests()  // 配置HTTP请求的授权规则
//                .requestMatchers("/rental/user/login").permitAll()  // 允许所有用户访问登录接口
//                .anyRequest().authenticated()  // 所有其他请求都需要经过身份验证
//                .and()
//
//                // 异常处理配置
//                .exceptionHandling()  // 配置异常处理机制
//               .authenticationEntryPoint(customerAnonymousEntryPoint)  // 自定义未认证用户的入口点*/
//                .accessDeniedHandler(customerAccessDeniedHandler)  // 自定义权限不足时的处理逻辑
//                .and()
//                // 配置跨域资源共享和禁用CSRF保护
//                .cors()  // 启用跨域资源共享（CORS）配置
//                .and()
//                .csrf().disable()  // 禁用CSRF保护（适用于无状态API）
//                .userDetailsService(customerUserDetailService);  // 指定自定义的UserDetailsService实现

        // 构建并返回配置好的Security过滤链
        return http.build();
    }


}
